{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Boxes.py example\n",
    "\n",
    "This notebook is an interactive example of a Boxes.py generator. Feel free to play around and see how the result changes.\n",
    "\n",
    "Check out http://florianfesti.github.io/boxes/html/index.html for documentation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from IPython.display import SVG, display\n",
    "\n",
    "import sys\n",
    "# sys.path.append('..') # uncomments and adjust if your Boxes.py copy in not in the Python path\n",
    "from boxes import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" height=\"208.80mm\" viewBox=\"0.0 0.0 182.20 208.80\" width=\"182.20mm\">\n",
       "<!--\n",
       "Example - Example: Single Shelve to screw to the wall\n",
       "\n",
       "Created with Boxes.py (https://festi.info/boxes.py)\n",
       "Creation date: 2024-02-11 17:45:59\n",
       "Command line (remove spaces between dashes): boxes Example - -reference=0\n",
       "-->\n",
       "<title>Example</title>\n",
       "<metadata>\n",
       "<rdf:RDF><cc:Work>\n",
       "<dc:title>Shelves - Example</dc:title>\n",
       "<dc:date>2024-02-11 17:45:59</dc:date>\n",
       "<dc:source>boxes Example --reference=0 --debug=0</dc:source>\n",
       "<dc:description>Example: Single Shelve to screw to the wall\n",
       "\n",
       "Created with Boxes.py (https://festi.info/boxes.py)\n",
       "Command line: boxes Example --reference=0 --debug=0\n",
       "Command line short: boxes Example --reference=0\n",
       "</dc:description>\n",
       "</cc:Work></rdf:RDF></metadata>\n",
       "<g id=\"p-0\" style=\"fill:none;stroke-linecap:round;stroke-linejoin:round;\">\n",
       "  <path d=\"M 13.100 198.800 H 163.100 H 166.100 C 166.155 198.800 166.200 198.755 166.200 198.700 V 185.700 C 166.200 185.645 166.155 185.600 166.100 185.600 H 163.200 C 163.100 185.600 163.200 185.700 163.200 185.600 V 176.800 C 163.200 176.700 163.100 176.800 163.200 176.800 H 166.100 C 166.155 176.800 166.200 176.755 166.200 176.700 V 170.700 C 166.200 170.645 166.155 170.600 166.100 170.600 H 163.200 C 163.100 170.600 163.200 170.700 163.200 170.600 V 161.800 C 163.200 161.700 163.100 161.800 163.200 161.800 H 166.100 C 166.155 161.800 166.200 161.755 166.200 161.700 V 148.700 V 142.700 C 166.200 142.645 166.155 142.600 166.100 142.600 H 163.100 H 13.100 H 10.100 C 10.045 142.600 10.000 142.645 10.000 142.700 V 148.700 V 161.700 C 10.000 161.755 10.045 161.800 10.100 161.800 H 13.000 C 13.100 161.800 13.000 161.700 13.000 161.800 V 170.600 C 13.000 170.700 13.100 170.600 13.000 170.600 H 10.100 C 10.045 170.600 10.000 170.645 10.000 170.700 V 176.700 C 10.000 176.755 10.045 176.800 10.100 176.800 H 13.000 C 13.100 176.800 13.000 176.700 13.000 176.800 V 185.600 C 13.000 185.700 13.100 185.600 13.000 185.600 H 10.100 C 10.045 185.600 10.000 185.645 10.000 185.700 V 198.700 C 10.000 198.755 10.045 198.800 10.100 198.800 H 13.100 Z\" stroke=\"rgb(0,0,0)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 151.700 158.700 C 151.700 158.432 151.777 158.169 151.922 157.943 C 152.067 157.717 152.274 157.538 152.518 157.427 C 152.763 157.315 153.034 157.276 153.299 157.314 C 153.565 157.352 153.814 157.466 154.017 157.642 C 154.220 157.818 154.368 158.048 154.443 158.306 C 154.519 158.563 154.519 158.837 154.443 159.094 C 154.368 159.352 154.220 159.582 154.017 159.758 C 153.814 159.934 153.565 160.048 153.299 160.086 C 153.034 160.124 152.763 160.085 152.518 159.973 C 152.274 159.862 152.067 159.683 151.922 159.457 C 151.777 159.231 151.700 158.968 151.700 158.700 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 148.100 145.800 H 152.500 C 152.600 145.800 152.500 145.700 152.500 145.800 V 148.600 C 152.500 148.700 152.600 148.600 152.500 148.600 H 143.700 C 143.600 148.600 143.700 148.700 143.700 148.600 V 145.800 C 143.700 145.700 143.600 145.800 143.700 145.800 H 148.100 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 133.100 145.800 H 137.500 C 137.600 145.800 137.500 145.700 137.500 145.800 V 148.600 C 137.500 148.700 137.600 148.600 137.500 148.600 H 128.700 C 128.600 148.600 128.700 148.700 128.700 148.600 V 145.800 C 128.700 145.700 128.600 145.800 128.700 145.800 H 133.100 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 118.100 145.800 H 122.500 C 122.600 145.800 122.500 145.700 122.500 145.800 V 148.600 C 122.500 148.700 122.600 148.600 122.500 148.600 H 113.700 C 113.600 148.600 113.700 148.700 113.700 148.600 V 145.800 C 113.700 145.700 113.600 145.800 113.700 145.800 H 118.100 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 103.100 145.800 H 107.500 C 107.600 145.800 107.500 145.700 107.500 145.800 V 148.600 C 107.500 148.700 107.600 148.600 107.500 148.600 H 98.700 C 98.600 148.600 98.700 148.700 98.700 148.600 V 145.800 C 98.700 145.700 98.600 145.800 98.700 145.800 H 103.100 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 88.100 145.800 H 92.500 C 92.600 145.800 92.500 145.700 92.500 145.800 V 148.600 C 92.500 148.700 92.600 148.600 92.500 148.600 H 83.700 C 83.600 148.600 83.700 148.700 83.700 148.600 V 145.800 C 83.700 145.700 83.600 145.800 83.700 145.800 H 88.100 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 73.100 145.800 H 77.500 C 77.600 145.800 77.500 145.700 77.500 145.800 V 148.600 C 77.500 148.700 77.600 148.600 77.500 148.600 H 68.700 C 68.600 148.600 68.700 148.700 68.700 148.600 V 145.800 C 68.700 145.700 68.600 145.800 68.700 145.800 H 73.100 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 58.100 145.800 H 62.500 C 62.600 145.800 62.500 145.700 62.500 145.800 V 148.600 C 62.500 148.700 62.600 148.600 62.500 148.600 H 53.700 C 53.600 148.600 53.700 148.700 53.700 148.600 V 145.800 C 53.700 145.700 53.600 145.800 53.700 145.800 H 58.100 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 43.100 145.800 H 47.500 C 47.600 145.800 47.500 145.700 47.500 145.800 V 148.600 C 47.500 148.700 47.600 148.600 47.500 148.600 H 38.700 C 38.600 148.600 38.700 148.700 38.700 148.600 V 145.800 C 38.700 145.700 38.600 145.800 38.700 145.800 H 43.100 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 28.100 145.800 H 32.500 C 32.600 145.800 32.500 145.700 32.500 145.800 V 148.600 C 32.500 148.700 32.600 148.600 32.500 148.600 H 23.700 C 23.600 148.600 23.700 148.700 23.700 148.600 V 145.800 C 23.700 145.700 23.600 145.800 23.700 145.800 H 28.100 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 23.100 160.100 C 22.832 160.100 22.569 160.023 22.343 159.878 C 22.117 159.733 21.938 159.526 21.827 159.282 C 21.715 159.037 21.676 158.766 21.714 158.501 C 21.752 158.235 21.866 157.986 22.042 157.783 C 22.218 157.580 22.448 157.432 22.706 157.357 C 22.963 157.281 23.237 157.281 23.494 157.357 C 23.752 157.432 23.982 157.580 24.158 157.783 C 24.334 157.986 24.448 158.235 24.486 158.501 C 24.524 158.766 24.485 159.037 24.373 159.282 C 24.262 159.526 24.083 159.733 23.857 159.878 C 23.631 160.023 23.368 160.100 23.100 160.100 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "</g>\n",
       "<g id=\"p-1\" style=\"fill:none;stroke-linecap:round;stroke-linejoin:round;\">\n",
       "  <path d=\"M 16.100 141.100 H 166.100 H 172.100 C 172.155 141.100 172.200 141.055 172.200 141.000 V 71.000 C 172.200 70.945 172.155 70.900 172.100 70.900 H 166.100 H 155.700 C 155.600 70.900 155.700 71.000 155.700 70.900 V 68.000 C 155.700 67.945 155.655 67.900 155.600 67.900 H 146.600 C 146.545 67.900 146.500 67.945 146.500 68.000 V 70.900 C 146.500 71.000 146.600 70.900 146.500 70.900 H 140.700 C 140.600 70.900 140.700 71.000 140.700 70.900 V 68.000 C 140.700 67.945 140.655 67.900 140.600 67.900 H 131.600 C 131.545 67.900 131.500 67.945 131.500 68.000 V 70.900 C 131.500 71.000 131.600 70.900 131.500 70.900 H 125.700 C 125.600 70.900 125.700 71.000 125.700 70.900 V 68.000 C 125.700 67.945 125.655 67.900 125.600 67.900 H 116.600 C 116.545 67.900 116.500 67.945 116.500 68.000 V 70.900 C 116.500 71.000 116.600 70.900 116.500 70.900 H 110.700 C 110.600 70.900 110.700 71.000 110.700 70.900 V 68.000 C 110.700 67.945 110.655 67.900 110.600 67.900 H 101.600 C 101.545 67.900 101.500 67.945 101.500 68.000 V 70.900 C 101.500 71.000 101.600 70.900 101.500 70.900 H 95.700 C 95.600 70.900 95.700 71.000 95.700 70.900 V 68.000 C 95.700 67.945 95.655 67.900 95.600 67.900 H 86.600 C 86.545 67.900 86.500 67.945 86.500 68.000 V 70.900 C 86.500 71.000 86.600 70.900 86.500 70.900 H 80.700 C 80.600 70.900 80.700 71.000 80.700 70.900 V 68.000 C 80.700 67.945 80.655 67.900 80.600 67.900 H 71.600 C 71.545 67.900 71.500 67.945 71.500 68.000 V 70.900 C 71.500 71.000 71.600 70.900 71.500 70.900 H 65.700 C 65.600 70.900 65.700 71.000 65.700 70.900 V 68.000 C 65.700 67.945 65.655 67.900 65.600 67.900 H 56.600 C 56.545 67.900 56.500 67.945 56.500 68.000 V 70.900 C 56.500 71.000 56.600 70.900 56.500 70.900 H 50.700 C 50.600 70.900 50.700 71.000 50.700 70.900 V 68.000 C 50.700 67.945 50.655 67.900 50.600 67.900 H 41.600 C 41.545 67.900 41.500 67.945 41.500 68.000 V 70.900 C 41.500 71.000 41.600 70.900 41.500 70.900 H 35.700 C 35.600 70.900 35.700 71.000 35.700 70.900 V 68.000 C 35.700 67.945 35.655 67.900 35.600 67.900 H 26.600 C 26.545 67.900 26.500 67.945 26.500 68.000 V 70.900 C 26.500 71.000 26.600 70.900 26.500 70.900 H 16.100 H 10.100 C 10.045 70.900 10.000 70.945 10.000 71.000 V 141.000 C 10.000 141.055 10.045 141.100 10.100 141.100 H 16.100 Z\" stroke=\"rgb(0,0,0)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 169.000 128.500 V 132.900 C 169.000 133.000 169.100 132.900 169.000 132.900 H 166.200 C 166.100 132.900 166.200 133.000 166.200 132.900 V 124.100 C 166.200 124.000 166.100 124.100 166.200 124.100 H 169.000 C 169.100 124.100 169.000 124.000 169.000 124.100 V 128.500 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 169.000 113.500 V 117.900 C 169.000 118.000 169.100 117.900 169.000 117.900 H 166.200 C 166.100 117.900 166.200 118.000 166.200 117.900 V 109.100 C 166.200 109.000 166.100 109.100 166.200 109.100 H 169.000 C 169.100 109.100 169.000 109.000 169.000 109.100 V 113.500 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 169.000 98.500 V 102.900 C 169.000 103.000 169.100 102.900 169.000 102.900 H 166.200 C 166.100 102.900 166.200 103.000 166.200 102.900 V 94.100 C 166.200 94.000 166.100 94.100 166.200 94.100 H 169.000 C 169.100 94.100 169.000 94.000 169.000 94.100 V 98.500 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 169.000 83.500 V 87.900 C 169.000 88.000 169.100 87.900 169.000 87.900 H 166.200 C 166.100 87.900 166.200 88.000 166.200 87.900 V 79.100 C 166.200 79.000 166.100 79.100 166.200 79.100 H 169.000 C 169.100 79.100 169.000 79.000 169.000 79.100 V 83.500 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 13.200 83.500 V 79.100 C 13.200 79.000 13.100 79.100 13.200 79.100 H 16.000 C 16.100 79.100 16.000 79.000 16.000 79.100 V 87.900 C 16.000 88.000 16.100 87.900 16.000 87.900 H 13.200 C 13.100 87.900 13.200 88.000 13.200 87.900 V 83.500 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 13.200 98.500 V 94.100 C 13.200 94.000 13.100 94.100 13.200 94.100 H 16.000 C 16.100 94.100 16.000 94.000 16.000 94.100 V 102.900 C 16.000 103.000 16.100 102.900 16.000 102.900 H 13.200 C 13.100 102.900 13.200 103.000 13.200 102.900 V 98.500 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 13.200 113.500 V 109.100 C 13.200 109.000 13.100 109.100 13.200 109.100 H 16.000 C 16.100 109.100 16.000 109.000 16.000 109.100 V 117.900 C 16.000 118.000 16.100 117.900 16.000 117.900 H 13.200 C 13.100 117.900 13.200 118.000 13.200 117.900 V 113.500 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 13.200 128.500 V 124.100 C 13.200 124.000 13.100 124.100 13.200 124.100 H 16.000 C 16.100 124.100 16.000 124.000 16.000 124.100 V 132.900 C 16.000 133.000 16.100 132.900 16.000 132.900 H 13.200 C 13.100 132.900 13.200 133.000 13.200 132.900 V 128.500 Z\" stroke=\"rgb(0,0,255)\" stroke-width=\"0.20\"/>\n",
       "</g>\n",
       "<g id=\"p-2\" style=\"fill:none;stroke-linecap:round;stroke-linejoin:round;\">\n",
       "  <path d=\"M 18.950 63.400 H 26.850 C 26.950 63.400 26.850 63.300 26.850 63.400 V 66.300 C 26.850 66.355 26.894 66.400 26.950 66.400 H 35.950 C 36.005 66.400 36.050 66.355 36.050 66.300 V 63.400 C 36.050 63.300 35.950 63.400 36.050 63.400 H 41.850 C 41.950 63.400 41.850 63.300 41.850 63.400 V 66.300 C 41.850 66.355 41.894 66.400 41.950 66.400 H 50.950 C 51.005 66.400 51.050 66.355 51.050 66.300 V 63.400 C 51.050 63.300 50.950 63.400 51.050 63.400 H 56.850 C 56.950 63.400 56.850 63.300 56.850 63.400 V 66.300 C 56.850 66.355 56.894 66.400 56.950 66.400 H 65.950 C 66.005 66.400 66.050 66.355 66.050 66.300 V 63.400 C 66.050 63.300 65.950 63.400 66.050 63.400 H 71.850 C 71.950 63.400 71.850 63.300 71.850 63.400 V 66.300 C 71.850 66.355 71.894 66.400 71.950 66.400 H 80.950 C 81.005 66.400 81.050 66.355 81.050 66.300 V 63.400 C 81.050 63.300 80.950 63.400 81.050 63.400 H 88.950 C 89.005 63.400 89.050 63.355 89.050 63.300 V 50.400 C 89.050 50.300 88.950 50.400 89.050 50.400 H 91.950 C 92.005 50.400 92.050 50.355 92.050 50.300 V 41.300 C 92.050 41.245 92.005 41.200 91.950 41.200 H 89.050 C 88.950 41.200 89.050 41.300 89.050 41.200 V 35.400 C 89.050 35.300 88.950 35.400 89.050 35.400 H 91.950 C 92.005 35.400 92.050 35.355 92.050 35.300 V 26.300 C 92.050 26.245 92.005 26.200 91.950 26.200 H 89.050 C 88.950 26.200 89.050 26.300 89.050 26.200 V 13.300 C 89.050 13.245 89.005 13.200 88.950 13.200 C 88.929 13.200 88.908 13.207 88.891 13.219 L 18.891 63.219 C 18.865 63.237 18.850 63.268 18.850 63.300 C 18.850 63.355 18.894 63.400 18.950 63.400 Z\" stroke=\"rgb(0,0,0)\" stroke-width=\"0.20\"/>\n",
       "  <path d=\"M 83.100 13.000 H 75.200 C 75.100 13.000 75.200 13.100 75.200 13.000 V 10.100 C 75.200 10.045 75.155 10.000 75.100 10.000 H 66.100 C 66.045 10.000 66.000 10.045 66.000 10.100 V 13.000 C 66.000 13.100 66.100 13.000 66.000 13.000 H 60.200 C 60.100 13.000 60.200 13.100 60.200 13.000 V 10.100 C 60.200 10.045 60.155 10.000 60.100 10.000 H 51.100 C 51.045 10.000 51.000 10.045 51.000 10.100 V 13.000 C 51.000 13.100 51.100 13.000 51.000 13.000 H 45.200 C 45.100 13.000 45.200 13.100 45.200 13.000 V 10.100 C 45.200 10.045 45.155 10.000 45.100 10.000 H 36.100 C 36.045 10.000 36.000 10.045 36.000 10.100 V 13.000 C 36.000 13.100 36.100 13.000 36.000 13.000 H 30.200 C 30.100 13.000 30.200 13.100 30.200 13.000 V 10.100 C 30.200 10.045 30.155 10.000 30.100 10.000 H 21.100 C 21.045 10.000 21.000 10.045 21.000 10.100 V 13.000 C 21.000 13.100 21.100 13.000 21.000 13.000 H 13.100 C 13.045 13.000 13.000 13.045 13.000 13.100 V 26.000 C 13.000 26.100 13.100 26.000 13.000 26.000 H 10.100 C 10.045 26.000 10.000 26.045 10.000 26.100 V 35.100 C 10.000 35.155 10.045 35.200 10.100 35.200 H 13.000 C 13.100 35.200 13.000 35.100 13.000 35.200 V 41.000 C 13.000 41.100 13.100 41.000 13.000 41.000 H 10.100 C 10.045 41.000 10.000 41.045 10.000 41.100 V 50.100 C 10.000 50.155 10.045 50.200 10.100 50.200 H 13.000 C 13.100 50.200 13.000 50.100 13.000 50.200 V 63.100 C 13.000 63.155 13.045 63.200 13.100 63.200 C 13.121 63.200 13.141 63.193 13.158 63.181 L 83.158 13.181 C 83.184 13.163 83.200 13.132 83.200 13.100 C 83.200 13.045 83.155 13.000 83.100 13.000 Z\" stroke=\"rgb(0,0,0)\" stroke-width=\"0.20\"/>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "class Example(Boxes): # Adjust class name and call below\n",
    "    \"\"\"Example: Single Shelve to screw to the wall\"\"\"\n",
    "\n",
    "    ui_group = \"Shelves\" # change for generators belonging in another group\n",
    "    \n",
    "    def __init__(self):\n",
    "        Boxes.__init__(self)\n",
    "        # arguments\n",
    "        self.addSettingsArgs(edges.FingerJointSettings, finger=3.0) # arguments for finger joints\n",
    "        self.buildArgParser(x=150, y=70, h=50)\n",
    "        self.argparser.add_argument(\n",
    "            \"--hole_dist\", action=\"store\", type=float, default=10.,\n",
    "            help=\"distance of the mounting holes to the boards\")\n",
    "        self.argparser.add_argument(\n",
    "            \"--hole_dia\", action=\"store\", type=float, default=3., # can't use \"hole\" as param name as it is a method\n",
    "            help=\"diameter of the mounting holes\")\n",
    "        \n",
    "    def render(self):\n",
    "        x, y, h = self.x, self.y, self.h\n",
    "        t = self.thickness\n",
    "        \n",
    "        # render-magic goes here\n",
    "        \n",
    "        hole = lambda: self.hole(self.hole_dist, self.hole_dist, d=self.hole_dia) # use lambda as a callback\n",
    "        # holes are placed relative to the inner rectangle of the back wall. The top part with the finger holes and \n",
    "        # the finges at the sides do not count.\n",
    "        # Callbacks start in the bottom left corner. Place holes in the third and forth corners only.       \n",
    "        self.rectangularWall(x, h, \"eFhF\", move=\"up\", callback=[None, None, hole, hole]) # back board\n",
    "\n",
    "        self.rectangularWall(x, y, \"ehfh\", move=\"up\") # top board\n",
    "        self.rectangularTriangle(y, h, \"ff\", num=2) # braces        \n",
    "        \n",
    "\n",
    "b = Example()\n",
    "b.parseArgs(['--reference=0', '--debug=0'])\n",
    "b.open()\n",
    "b.render()\n",
    "data = b.close()\n",
    "\n",
    "display(SVG(data=data.getvalue()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
